//！ 语句与表达式

// Rust会为每个crate引用标准库包以及prelude模块，除非使用#![no_std]属性明确指定不需要标准库
// extern crate std;
// use std::prelude::v1::*;

pub fn start() {
    // 函数 answer没有输入参数，并且返回值为单元类型() 。单元类型拥有唯一的值， 就是它 本身，为了描述方便，将该值称为单元值。
    // 单元类型的概念来自 OCmal，它表示 “没有什么 特殊的价值” 。 所以，这里将单元类型作为函数返回值， 就表示该函数无返回值。当然，
    // 通 常无运回值的函数默认不需要在函数签名中指定返回类型 。
    // 在函数 answer 中， 使用 let声明了两个变量 a和 b， 其后必须加分号。 assert_eq!则是宏 语句，它是 Rust提供的断言，
    // 允许判断给定的两个表达式求值结果是否相同。像这种名字以 叹号结尾， 并且可以像函数一样被调用的语句， 在 Rust中叫作宏。
    // 函数 sum 的两个输入参数和返回值均指定为 i32 类型。其函数体只包含了一个表达式 ， 用于计算 a与 b 的值， 并返回。
    fn answer() -> () {
        let a = 40;
        let b = 2;
        assert_eq!(sum(a, b), 42)
    }

    fn sum(a: i32, b: i32) -> i32 {
        a + b
    }

    // Rust 编译器在解析代码的时候，如果碰到分号，就会继续往后面执行;如果碰到语旬， 则执行语句;如果碰到表达式，
    // 则会对表达式求值，如果分号后面什么都没有，就会补上单元值。 。
    // 当遇到函数的时候，会将函数体的花括号识别为块表达式( Block Expression)。
    // 块表达式是由一对花括号和一系列表达式组成的，它总是返回块中最后一个表达式的值 。
    // 对 于 answer函数来说， 它也是一个块表达式，块中的最后一个表达式是宏语句，所以返回单元 值()。
    // 对于 sum 函数来说，其最后一行是一个表达式，因为没有分号，所以直接返回其求值结果。
    answer();
}
